#include <logbase.h>
#include <stdarg.h>
#include <fcntl.h> // file option
#include <errno.h>

typedef struct
{
    int intBufLen;
    int *intBufPtr;
} myIntBufStc;

#define chkIntPtrSize (sizeof(int) * 1)

int intBufInit(myIntBufStc *mybuf, int cfglen)
{
    if(!mybuf)
    {
        logerrorc("null ptr!");
        return -1;
    }
    mybuf->intBufLen = 0;
    mybuf->intBufPtr = NULL;
    if(!(cfglen > 0 && cfglen < 1000000))
    {
        logerrorc("size error:%d", cfglen);
        return -1;
    }
    mybuf->intBufPtr = (int *)malloc(sizeof(int) * cfglen);
    if(!mybuf->intBufPtr)
    {
        logerrorc("malloc error:%d!", cfglen);
        return -1;
    }
    return (mybuf->intBufLen = cfglen);
}

void intBufFree(myIntBufStc *mybuf)
{
    if(!mybuf)
    {
        logerrorc("null ptr!");
        return;
    }
    mybuf->intBufLen = 0;
    if(mybuf->intBufPtr)
    {
        free(mybuf->intBufPtr);
        mybuf->intBufPtr = NULL;
    }
}

int main(int argc, char **argv)
{
    myIntBufStc tmpsl;
    intBufInit(&tmpsl, 10);
    if(tmpsl.intBufLen < 10)
    {
        logerrorc("");
        return -1;
    }
    tmpsl.intBufPtr[0] = 101;
    logdebugc("origin ptr info:ptr=%p,len=%d", tmpsl.intBufPtr, tmpsl.intBufLen);
    {
        myIntBufStc tmpibs1 = tmpsl;//浅拷贝
        //　可以看到，tmpibs1.intBufPtr和tmpsl.intBufPtr的地址是一样的，这就时浅拷贝．
        logdebugc("shallow copy ptr info:ptr=%p,len=%d", tmpibs1.intBufPtr, tmpibs1.intBufLen);

        intBufFree(&tmpsl);
        logdebugc("origin after free info:ptr=%p,len=%d", tmpsl.intBufPtr, tmpsl.intBufLen);
        // 原始数据被释放．但浅拷贝的地址还是指向原来的地址．但此时不能操作浅拷贝的地址空间了．
        logdebugc("shallow copy now info:ptr=%p,len=%d", tmpibs1.intBufPtr, tmpibs1.intBufLen);
        // 这里再次释放，会崩溃．
        intBufFree(&tmpibs1);
        //　如何解决呢？深拷贝，指针转移．
    }
    return 1;
}
